<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>StrGet() | AutoHotkey v1</title>
<meta name="description" content="The StrGet function copies a string from a memory address, optionally converting it from a given code page." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
</head>
<body>

<h1>StrGet() <span class="ver">[AHK_L 46+]</span></h1>

<p>从内存地址复制字符串, 可选地将其从给定的代码页转换为可识别的字符串.</p>

<pre class="Syntax">String := <span class="func">StrGet</span>(Source <span class="optional">, Length, Encoding</span>)
String := <span class="func">StrGet</span>(Source <span class="optional">, Encoding</span>)</pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>Source</dt>
  <dd>
    <p>字符串的内存地址.</p>
    <p>如果指定了 <em>Length</em>, 则字符串不需要以<a href="../Concepts.htm#null-termination">空终止符</a>结尾.</p>
  </dd>

  <dt>Length</dt>
  <dd>
    <p>如果省略(或使用双参数模式时), 则默认为字符串的当前长度, 前提是字符串以<a href="../Concepts.htm#null-termination">空终止符</a>结尾. 否则, 请指定需读取的长度, 以<a href="../Concepts.htm#character">字符</a>为单位.</p>
    <p class="warning"><strong>注意:</strong> 如果字符串不是以空终止符结尾的, 则省略 <em>Length</em> 可能会造成访问冲突, 从而导致程序终止或其他一些不希望的结果. 指定不正确的长度可能会产生意外的行为.</p>
    <p class="warning"><strong>注意:</strong> 不支持嵌入的空终止符, 这通常会导致字符串的截断.</p>
  </dd>

  <dt>Encoding</dt>
  <dd>
    <p>如果省略, 那么将简单地复制字符串, 而不进行任何转换. 否则, 请指定源编码; 例如, <code>"UTF-8"</code>, <code>"UTF-16"</code> 或 <code>"CP936"</code>. 对于数字标识符, 只有在 3 参数模式中, 才可以省略前缀 "CP". 指定空字符串或 <code>"CP0"</code> 则使用系统默认 ANSI 代码页.</p>
  </dd>

</dl>

<h2 id="Return_Value">返回值</h2>
<p>函数返回复制或转换后的字符串. 如果正确地指定了源编码, 则返回值总是使用<a href="../Concepts.htm#string-encoding">原生编码</a>. 返回值总是以<a href="../Concepts.htm#null-termination">空终止符</a>终止, 但是空终止符不包括在返回值的 <a href="StringLen.htm">length</a> 中.</p>

<h2 id="Error_Handling">错误处理</h2>
<p>如果检测到无效参数或转换无法执行, 则返回空字符串.</p>

<h2 id="Remarks">备注</h2>
<p>注意, 返回值总是使用当前可执行文件的<a href="../Concepts.htm#string-encoding">原生编码</a>, 而 <i>Encoding</i> 指定了如何解释从给定 <i>Source</i> 读取到的字符串. 如果没有指定 <em>Encoding</em>, 则只复制字符串而不进行任何转换.</p>
<p class="note">换句话说, StrGet 用于从内存地址检索文本, 或者将其转换为脚本可以接受的格式.</p>
<p>如果需要在代码页之间进行转换, 返回值的长度可能与源字符串的长度不同.</p>

<h2 id="Related">相关</h2>
<p><a href="../Concepts.htm#string-encoding">字符编码</a>, <a href="StrPut.htm">StrPut()</a>, <a href="../Compat.htm">脚本兼容性</a>, <a href="FileEncoding.htm">FileEncoding</a>, <a href="DllCall.htm">DllCall()</a>, <a href="VarSetCapacity.htm">VarSetCapacity()</a></p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExNumEnc">
<p><a class="ex_number" href="#ExNumEnc"></a> <em>Length</em> 或 <em>Encoding</em> 都可以直接在 <em>Source</em> 后面指定, 但在这种情况下 <em>Encoding</em> 必须是非数字的.</p>
<pre>
str := StrGet(address, "cp0")  <em>; 代码页 0, 未指定长度</em>
str := StrGet(address, n, 0)   <em>; 最大 n 字符, 代码页 0</em>
str := StrGet(address, 0)      <em>; 最大 0 字符(始终为空)</em>
</pre>
</div>

</body>
</html>